<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2012 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------
// $Id: View.class.php 2702 2012-02-02 12:35:01Z liu21st $


/**
 +------------------------------------------------------------------------------
 * ThinkPHP 视图输出
 +------------------------------------------------------------------------------
 * @category   Think
 * @package  Think
 * @subpackage  Core
 * @author liu21st <liu21st@gmail.com>
 * @version  $Id: View.class.php 2702 2012-02-02 12:35:01Z liu21st $
 +------------------------------------------------------------------------------
 */
class View {
	protected $tVar = array (); // 模板输出变量
	

	/**
     +----------------------------------------------------------
	 * 模板变量赋值
     +----------------------------------------------------------
	 * @access public
     +----------------------------------------------------------
	 * @param mixed $name
	 * @param mixed $value
     +----------------------------------------------------------
	 */
	public function assign($name, $value = '') {
		if (is_array ( $name )) {
			$this->tVar = array_merge ( $this->tVar, $name );
		} elseif (is_object ( $name )) {
			foreach ( $name as $key => $val )
				$this->tVar [$key] = $val;
		} else {
			$this->tVar [$name] = $value;
		}
	}
	
	/**
     +----------------------------------------------------------
	 * 取得模板变量的值
     +----------------------------------------------------------
	 * @access public
     +----------------------------------------------------------
	 * @param string $name
     +----------------------------------------------------------
	 * @return mixed
     +----------------------------------------------------------
	 */
	public function get($name) {
		if (isset ( $this->tVar [$name] ))
			return $this->tVar [$name];
		else
			return false;
	}
	
	/* 取得所有模板变量 */
	public function getAllVar() {
		return $this->tVar;
	}
	
	// 调试页面所有的模板变量
	public function traceVar() {
		foreach ( $this->tVar as $name => $val ) {
			dump ( $val, 1, '[' . $name . ']<br/>' );
		}
	}
	
	/**
     +----------------------------------------------------------
	 * 加载模板和页面输出 可以返回输出内容
     +----------------------------------------------------------
	 * @access public
     +----------------------------------------------------------
	 * @param string $templateFile 模板文件名
	 * @param string $charset 模板输出字符集
	 * @param string $contentType 输出类型
     +----------------------------------------------------------
	 * @return mixed
     +----------------------------------------------------------
	 */
	public function display($templateFile = '', $charset = '', $contentType = '') {
		G ( 'viewStartTime' );
		// 视图开始标签
		tag ( 'view_begin', $templateFile );
		// 解析并获取模板内容
		$content = $this->fetch ( $templateFile );
		// 输出模板内容
		$this->show ( $content, $charset, $contentType );
		// 视图结束标签
		tag ( 'view_end' );
	}
	
	/**
     +----------------------------------------------------------
	 * 输出内容文本可以包括Html
     +----------------------------------------------------------
	 * @access public
     +----------------------------------------------------------
	 * @param string $content 输出内容
	 * @param string $charset 模板输出字符集
	 * @param string $contentType 输出类型
     +----------------------------------------------------------
	 * @return mixed
     +----------------------------------------------------------
	 */
	public function show($content, $charset = '', $contentType = '') {
		if (empty ( $charset ))
			$charset = C ( 'DEFAULT_CHARSET' );
		if (empty ( $contentType ))
			$contentType = C ( 'TMPL_CONTENT_TYPE' );
		
		// 网页字符编码
		header ( 'Content-Type:' . $contentType . '; charset=' . $charset );
		header ( 'Cache-control: private' ); //支持页面回跳
		header ( 'X-Powered-By:ThinkPHP' );
		// 输出模板文件
		echo $content;
	}
	
	/**
     +----------------------------------------------------------
	 * 解析和获取模板内容 用于输出
     +----------------------------------------------------------
	 * @access public
     +----------------------------------------------------------
	 * @param string $templateFile 模板文件名
     +----------------------------------------------------------
	 * @return string
     +----------------------------------------------------------
	 */
	public function fetch($templateFile = '') {
		// 模板文件解析标签
		tag ( 'view_template', $templateFile );
		// 模板文件不存在直接返回
		if (! is_file ( $templateFile ))
			return NULL;
		
		// 页面缓存
		ob_start ();
		ob_implicit_flush ( 0 );
		if ('php' == strtolower ( C ( 'TMPL_ENGINE_TYPE' ) )) { // 使用PHP原生模板
			// 模板阵列变量分解成为独立变量
			extract ( $this->tVar, EXTR_OVERWRITE );
			// 直接载入PHP模板
			include $templateFile;
		} else {
			// 视图解析标签
			$params = array ('var' => $this->tVar, 'file' => $templateFile );
			tag ( 'view_parse', $params );
		}
		// 获取并清空缓存
		$content = ob_get_clean ();
		// 内容过滤标签
		tag ( 'view_filter', $content );
		// 输出模板文件
		return $content;
	}
}